#include <iostream> 
#include <algorithm>

using namespace std;

#define MAX_N 50000

struct Data {
    int l, r, id;  // l: 开始时间, r: 结束时间, id: 奶牛的原始输入顺序
} arr[MAX_N + 5];

int m_time[MAX_N + 5];  // 存储每台挤奶机的当前结束时间
int ans[MAX_N + 5];     // 存储每头奶牛使用的挤奶机编号
int cnt = 0;            // 记录所需的总挤奶机数量

// 比较函数：按开始时间排序，如果开始时间相同，则按输入顺序排序
bool cmp(const Data &a, const Data &b) {
    return a.l < b.l;
}
bool cmp2(const Data &a, const Data &b) {
    if (a.l != b.l) return a.l < b.l;
    return a.id < b.id;
}

int main() {
    int n;
    scanf("%d", &n);  // 读取奶牛数量

    // 读取每头奶牛的开始和结束时间，并记录原始输入顺序
    for (int i = 0; i < n; i++) {
        scanf("%d%d", &arr[i].l, &arr[i].r);
        arr[i].id = i;
    }

    // 按照开始时间排序
    stable_sort(arr, arr + n, cmp);
    // sort(arr, arr + n, cmp2);

    // 逐头处理奶牛，分配挤奶机
    for (int i = 0; i < n; i++) {
        int pos = -1;  // 标记当前奶牛可以使用的挤奶机编号

        // 遍历已有的挤奶机，查找是否有空闲的机器（结束时间早于当前奶牛的开始时间）
        for (int j = 0; j < cnt; j++) {
            if (m_time[j] < arr[i].l) {
                pos = j;  // 找到可以复用的挤奶机
                break;
            }
        }

        // 如果没有找到空闲的机器，增加一台新机器
        if (pos == -1) pos = (cnt++);

        // 更新使用该机器的结束时间
        m_time[pos] = arr[i].r;

        // 记录当前奶牛使用的挤奶机编号（机器编号从1开始）
        ans[arr[i].id] = pos + 1;
    }

    // 输出总共需要的挤奶机数量
    printf("%d\n", cnt);

    // 按输入顺序输出每头奶牛使用的挤奶机编号
    for (int i = 0; i < n; i++) {
        printf("%d\n", ans[i]);
    }

    return 0;
} 